Network based storage, or simply “network storage”, is a common approach to backing up data, making large amounts of data accessible to multiple users, and other purposes. In a network storage environment, a storage server makes data available to client (host) systems by presenting or exporting to the clients one or more logical containers of data. There are various forms of network storage, including network attached storage (NAS) and storage area network (SAN). In a NAS context, a storage server services file-level requests from clients, whereas in a SAN context a storage server services block-level requests. Some storage servers are capable of servicing both file-level requests and block-level requests.
There are multiple mechanisms (or protocols) by which a user may wish to access data stored in a network storage system. For example, consider a case where a user wishes to access a document stored at a particular location in a network storage system. The user may use a file protocol, such as a Network File System (NFS) protocol or Common Internet File System (CIFS) protocol, to access the document over a local area network in a manner similar to how local storage is accessed. The user may also use an object protocol, such as the Hypertext Transfer Protocol (HTTP) protocol or the (Cloud Data Management Interface (CDMI) protocol, to access stored data over a local area network, or over a wide area network such as the Internet.
Additionally, object clients using object protocols expect significantly different behaviors when accessing and modifying data when compared to file protocols (e.g. CIFS and NFS). For example, if two file clients concurrently modify and read a file using file protocols, their requested writes and reads are performed as a series of non-atomic write and read operations. These write and read operations are either denied (as a result of access being denied because the file is locked by another file client), or are performed sequentially on a per-client basis, but concurrently across clients. This can result in a situation where the client reading from the file receives a mixture of data as it existed before it was updated by the writing client and data that has been updated by the writing client. Furthermore, the mixture of old and new data is highly timing dependent, and is often non-deterministic in nature. For file clients, this is considered to be undesired behavior, and is typically avoided by using file lock mechanisms to prevent concurrent operations. Furthermore, if two or more clients write to the same location within the same file, the later write overwrites the earlier write, and when interleaved, can result in data loss and corruption.
In contrast, the entirety of modifications to and reading from an object using object protocols is atomic, that is, all object writes and reads are performed in the context of the state of the entire object at the time the operation is performed, rather than as a series of individual operations that create intermediate states as they are applied. With atomic transactions, the entire set of write operations or the entire set of read operations are performed atomically, such that a client reading the contents of the object will either get the state of the object before the writes were applied, or the state of the object after the writes were applied, but never a mixture of the state before and the state after the writes are applied. This means that for object protocols, concurrent clients always interact with a consistent state of the data stored within an object, regardless of the number and type of operations in progress. Due to the atomic nature of object updates, versions of the object file are also easily supported and are often expected by object clients to handle situations that would typically be denied by file locking when using file protocols. This permits object protocols to be used in situations where distributed, wide-area, and disconnected operations prevent file protocols from being effectively used.
Traditional storage systems do not permit read access and write access to a common file system using concurrent file protocol and object protocol, and do not fully conform to the semantics required to provide full file protocol and object protocol duality.